package exception;

public class ExceptionDemo {

    public static void main(String[] args) {
        // 异常处理的第一种方案：捕获异常try-catch。目的是立即处理。
        try {
            // TODO 期望正常执行的流程放这里
            int[] arr = new int[10];
            arr[10] = 18; // 访问第11个元素会怎样？会产生数组下标越界异常

            // 下面的代码会产生空指针异常
            String str = null; // 引用类型的常量，表示空（即不存在）
            str.toString();

            System.out.println("这一行代码不会执行！");
            System.out.println("value:" + arr[10]);
        } catch (ArrayIndexOutOfBoundsException ex) { // 捕获一个具体的异常对象。如果直接捕获Exception类型异常，就会非常笼统。
            // TODO 出现异常之后需要补救的代码放这里
            // catch代码块中主要放两部分程序：
            // 1. 程序调试日志（异常的详情，给程序员看的！）
            System.out.println("错误原因：" + ex.getMessage());
            System.out.println("错误详情：");
            ex.printStackTrace();
            // 2. 尝试修复或者给用户一个友好的指引
            System.out.println("请检查数组下标是否越界，再重新尝试！");
        } catch (NullPointerException ex) { // 解决方案：catch中将每一类异常单独捕获，提供更加精准的补救措施！
            // 1. 程序调试日志（异常的详情，给程序员看的！）
            System.out.println("错误原因：" + ex.getMessage());
            System.out.println("错误详情：");
            ex.printStackTrace();
            // 2. 尝试修复或者给用户一个友好的指引
            System.out.println("系统错误，请联系管理员！");
        }
    }
}
